const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const MiniCssExtractPlugin = require('mini-css-extract-plugin')
// 有点：将样式通过link标签引入而不是style(不会出现闪屏现象)，同时减少了js的打包体积
const optimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')

// 设置node.js环境变量
// process.env.NODE_ENV = 'development'

module.exports = {
  entry: './src/js/index.js',
  output: {
    filename: 'js/built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          // 'style-loader', // 创建style标签将样式放入

          MiniCssExtractPlugin.loader, // 取代js中的css成单独文件并自动引入index.html
          'css-loader', // 将css文件整合到js文件
          /**
           * css兼容性处理： postcss --> postcss-loader postcss-preset-env
           */
          // 1.使用loader的默认配置写法
          // 如：'postcss-loader'
          // 2. 对象方式，可修改配置
          {
            loader: 'postcss-loader',
            options: {
              ident: 'postcss',
              // 使用postcss的一些插件，返回值为数组
              plugins: () => [
                //postcss的插件之一，帮助postcss找到browserslist(npm有这个库：浏览器兼容性处理)【package.json中】，通过配置加载指定的css兼容性样式
                /**
                 * "browserslist" : {
                 * // 开发环境-->设置node环境变量
                      "development": [
                        "last 1 chrome version",
                        "last 1 firefox version",
                        "last 1 safari version"
                      ],
                      // 生产环境：默认会看生产环境，和webpack的mode指定的模式无关
                      "production": [
                        ">0.2%",
                        "not dead",
                        "not op_mini all"
                      ]
                    }
                 */
                require('postcss-preset-env')()
              ]
            }
          }
        ]
      },
      /**
       * 语法检查：eslint-loader eslint (eslint依赖于eslint-loader)
       *  注意：只检查自己写的源代码，第三方库不检查
       *  设置检查规则：
       *  package.jsonz中eslintConfig配置
       * "eslintConfig": {
            "extends": "airbnb-base"  // 扩展自airbnb-base
          }
       *  airbnb规则 eslint-config-airbnb-base [需要eslint, eslint-plugin-import]
       */
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'eslint-loader',
        options: {
          // 自动修复eslint的错误
          fix: true
        }
      },
      /**
       * js兼容性处理 babel-loader[依赖@babel/core]
       *  b
       *  1. 基本的兼容性处理 --> @babel/preset-env
       *    presets: [
       *      '@babel/preset-env'
       *    ]
       *    问题：只能转换基本语法，如promise在IE浏览器不能转换
       *  2. 全部js兼容性处理：--> @babel/polyfill  (不是babel的插件，引入即可使用)
       *    缺点：将所有的兼容性代码都引入了，打包体积会变大
       *  3. 需要做兼容性处理的再做：按需加载 --> core-js
       * 
       */
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          //预设：指示babel做怎样的兼容性处理
          presets: [
            // '@babel/preset-env',
            [
              '@babel/preset-env',
              {
                // 按需加载
                useBuiltIns: 'usage',
                // 指定corejs的版本
                corejs: {
                  version: 3
                },
                // 指定兼容性做到哪个版本的浏览器
                targets: {
                  chrome: '60',
                  firefox: '60',
                  ie: '9',
                  safari: '10',
                  edge: '17'
                }
              }
            ]
          ]
        }
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    }),
    new MiniCssExtractPlugin({
      // 指定放入的文件夹
      filename: 'css/main.css'
    }),
    // 内部配置足够压缩css，无需再额外配置
    new optimizeCssAssetsWebpackPlugin()
  ],
  mode: 'development'
}
